package Composite;
/**
 * @Author: Cjj
 * 组合模式：
 *  组合模式是将对象组合成树形结构以表示“部分-整体”的层次结构。
 *  组合模式使得用户对单个对象和组合对象的使用具有一致性
 * 主要解决的问题：
 *  简化树形结构中对象的处理,无论它们是单个对象还是组合对象
 *  解耦客户端代码与复杂元素的内部结构，使得客户端可以统一处理所有类型的节点。
 * 使用场景：
 *  当需要表示对象的层次结构时,如文件系统或组织结构
 *  当希望客户端代码能够以一致的方式处理树形结构中的所有对象时
 * 实现方式：
 *  统一接口：定义一个接口,所有对象(树枝和叶子)都实现这个接口
 *  组合结构：树枝对象包含一个接口的引用列表，这些引用可以是叶子或树枝。
 * 关键代码：
 *  Component接口：定义了所有对象必须实现的操作
 *  Leaf类：实现Component接口，代表树中的叶子节点
 *  Composite类：实现Component接口，代表树中的非叶子节点(并包含其他Component)对象的集合
 *
 */
public class CompositePatternDemo {
    public static void main(String[] args) {
      Employee CEO =  new Employee("John","CEO",30000);
        Employee headSales = new Employee("Robert", "CTO", 20000);
        Employee headMarketing = new Employee("Michel", "Head Marketing", 20000);

        Employee clerk1 = new Employee("Laura", "Marketing", 10000);
        Employee clerk2 = new Employee("Bob", "Marketing", 10000);

        Employee saleExecutive1 = new Employee("Julie", "Sales", 10000);
        Employee saleExecutive2 = new Employee("Rob", "Sales", 10000);

        CEO.add(headSales);
        CEO.add(headMarketing);

        headSales.add(saleExecutive1);
        headSales.add(saleExecutive2);

        headMarketing.add(clerk1);
        headMarketing.add(clerk2);

        System.out.println(CEO);
        for (Employee headEmployee : CEO.getSubordinates()) {
            System.out.println(headEmployee);
            for (Employee employee : headEmployee.getSubordinates()) {
                System.out.println(employee);
            }
        }
    }
}
